#!/bin/bash

#==============================================================================
# 文件整理脚本 (File Sorting Script)
#==============================================================================
# 
# 功能描述:
#   根据文件扩展名自动将文件分类到不同的子文件夹中
#   支持7大类文件类型，未识别的文件统一放入Other文件夹
#
# 作者: Pedro.Pei
# 版本: 2.0
# 更新日期: 2024
#
# 支持的文件类型:
#   📹 视频文件 (Video): mp4, mkv, avi, mov, m4v, webm, flv, wmv, 3gp, m2ts
#   🎵 音频文件 (Audio): mp3, wav, aac, ogg, flac, m4a, wma, opus
#   🖼️  图片文件 (Image): jpg, jpeg, png, gif, bmp, tiff, svg, webp, ico, heic, avif
#   📄 文档文件 (Documents): pdf, doc, docx, txt, odt, rtf, md, epub, mobi, pages, numbers, key
#   📦 压缩文件 (Archives): zip, tar, gz, bz2, 7z, rar, xz, dmg, pkg
#   💻 代码文件 (Code): py, c, cpp, h, java, js, css, html, php, rb, go, rs, swift, kt, ts, jsx, tsx, vue, scss, sass, less
#   📁 其他文件 (Other): 所有未匹配的文件类型
#
# 特性:
#   ✅ 支持大小写扩展名识别 (.MP4 和 .mp4 都能正确识别)
#   ✅ 实时进度显示和详细统计信息
#   ✅ 错误处理和安全检查
#   ✅ 自动创建目标文件夹
#   ✅ 支持现代文件格式
#
# 使用方法:
#   ./file_sorting_script.sh <源目录路径>
#
# 使用示例:
#   # 整理当前目录下的文件
#   ./file_sorting_script.sh .
#   
#   # 整理指定目录的文件
#   ./file_sorting_script.sh /Users/pedro/Downloads
#   
#   # 整理桌面文件
#   ./file_sorting_script.sh ~/Desktop
#
# 输出结果:
#   脚本会在源目录下创建以下子文件夹:
#   ├── Video/      (视频文件)
#   ├── Audio/      (音频文件)
#   ├── Image/      (图片文件)
#   ├── Documents/  (文档文件)
#   ├── Archives/   (压缩文件)
#   ├── Code/       (代码文件)
#   └── Other/      (其他文件)
#
# 注意事项:
#   ⚠️  请确保对源目录有读写权限
#   ⚠️  建议先备份重要文件
#   ⚠️  脚本会移动文件，不是复制
#   ⚠️  相同文件名会被覆盖，请注意检查
#
#==============================================================================

# 检查是否提供了源目录参数
if [ -z "$1" ]; then
  echo "Usage: $0 <source_directory>"
  exit 1
fi

# 获取并验证源目录
source_dir=$(realpath "$1")
if [ ! -d "$source_dir" ]; then
  echo "Error: Source directory '$1' does not exist."
  exit 1
fi

# 定义目标子文件夹路径
# 所有分类文件夹都将在源目录下创建
video_dir="$source_dir/Video"        # 视频文件目录
audio_dir="$source_dir/Audio"        # 音频文件目录
image_dir="$source_dir/Image"        # 图片文件目录
document_dir="$source_dir/Documents" # 文档文件目录
archive_dir="$source_dir/Archives"   # 压缩文件目录
code_dir="$source_dir/Code"          # 代码文件目录
other_dir="$source_dir/Other"        # 其他文件目录

# 创建目标子文件夹（如果它们不存在）
# 使用 -p 参数确保父目录存在时不会报错
mkdir -p "$video_dir" "$audio_dir" "$image_dir" "$document_dir" "$archive_dir" "$code_dir" "$other_dir"

# 初始化文件计数器
# 用于统计处理的文件数量和各类型文件数量
total_files=0     # 总文件数
video_count=0     # 视频文件数
audio_count=0     # 音频文件数
image_count=0     # 图片文件数
document_count=0  # 文档文件数
archive_count=0   # 压缩文件数
code_count=0      # 代码文件数
other_count=0     # 其他文件数

start_time=$(date +%s)
echo "开始整理文件..."
echo "源目录: $source_dir"
echo "开始时间: $(date)"
echo "正在扫描和分类文件..."
echo ""

# 统一处理所有文件（支持大小写扩展名）
# 遍历源目录中的所有文件，不包括子目录
for file in "$source_dir"/*; do
  # 检查是否为普通文件（不是目录或链接）
  if [ -f "$file" ]; then
    total_files=$((total_files + 1))  # 增加总文件计数
    filename=$(basename "$file")      # 获取文件名（不含路径）
    
    # 获取文件扩展名并转换为小写
    # ${file##*.} 表示删除最后一个点之前的所有内容
    ext="${file##*.}"
    ext_lower=$(echo "$ext" | tr '[:upper:]' '[:lower:]')  # 转换为小写以支持大小写不敏感匹配
    
    # 根据扩展名分类文件
    # 使用case语句进行模式匹配，支持多个扩展名用|分隔
    case "$ext_lower" in
      # 视频文件类型处理
      # 支持主流视频格式，包括高清和流媒体格式
      mp4|mkv|avi|mov|m4v|webm|flv|wmv|3gp|m2ts)
        if mv "$file" "$video_dir/" 2>/dev/null; then
          echo "视频: $filename -> Video/"
          video_count=$((video_count + 1))
        else
          echo "错误: 无法移动 $filename"  # 可能是权限问题或目标文件已存在
        fi
        ;;
      # 音频文件类型处理
      # 支持无损和有损音频格式
      mp3|wav|aac|ogg|flac|m4a|wma|opus)
        if mv "$file" "$audio_dir/" 2>/dev/null; then
          echo "音频: $filename -> Audio/"
          audio_count=$((audio_count + 1))
        else
          echo "错误: 无法移动 $filename"  # 可能是权限问题或目标文件已存在
        fi
        ;;
      # 图片文件类型处理
      # 支持传统和现代图片格式，包括矢量图和新一代格式
      jpg|jpeg|png|gif|bmp|tiff|svg|webp|ico|heic|avif)
        if mv "$file" "$image_dir/" 2>/dev/null; then
          echo "图片: $filename -> Image/"
          image_count=$((image_count + 1))
        else
          echo "错误: 无法移动 $filename"  # 可能是权限问题或目标文件已存在
        fi
        ;;
      # 文档文件类型处理
      # 支持办公文档、电子书和标记语言文件
      pdf|doc|docx|txt|odt|rtf|md|epub|mobi|pages|numbers|key)
        if mv "$file" "$document_dir/" 2>/dev/null; then
          echo "文档: $filename -> Documents/"
          document_count=$((document_count + 1))
        else
          echo "错误: 无法移动 $filename"  # 可能是权限问题或目标文件已存在
        fi
        ;;
      # 压缩文件类型处理
      # 支持各种压缩格式和安装包
      zip|tar|gz|bz2|7z|rar|xz|dmg|pkg)
        if mv "$file" "$archive_dir/" 2>/dev/null; then
          echo "压缩包: $filename -> Archives/"
          archive_count=$((archive_count + 1))
        else
          echo "错误: 无法移动 $filename"  # 可能是权限问题或目标文件已存在
        fi
        ;;
      # 代码文件类型处理
      # 支持主流编程语言和前端开发文件
      py|c|cpp|h|java|js|css|html|php|rb|go|rs|swift|kt|ts|jsx|tsx|vue|scss|sass|less)
        if mv "$file" "$code_dir/" 2>/dev/null; then
          echo "代码: $filename -> Code/"
          code_count=$((code_count + 1))
        else
          echo "错误: 无法移动 $filename"  # 可能是权限问题或目标文件已存在
        fi
        ;;
      # 其他未识别文件类型处理
      # 所有不匹配上述类型的文件都会被归类到Other文件夹
      *)
        if mv "$file" "$other_dir/" 2>/dev/null; then
          echo "其他: $filename -> Other/"
          other_count=$((other_count + 1))
        else
          echo "错误: 无法移动 $filename"  # 可能是权限问题或目标文件已存在
        fi
        ;;
    esac
  fi
done

echo ""
end_time=$(date +%s)
duration=$((end_time - start_time))
echo "文件整理完成！"
echo "==================="
# 输出详细的统计报告
# 显示总文件数和各类型文件的分布情况
echo "总文件数: $total_files"
echo "视频文件: $video_count"
echo "音频文件: $audio_count"
echo "图片文件: $image_count"
echo "文档文件: $document_count"
echo "压缩文件: $archive_count"
echo "代码文件: $code_count"
echo "其他文件: $other_count"
echo "处理耗时: ${duration}秒"
echo "==================="

# 脚本执行完毕
# 所有文件已按类型分类到相应的子文件夹中
